package projeto.comercial.gerenciarservico.cgt;

import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;

import plataforma.crud.cgt.ServiceCrud;
import plataforma.crudestatico.cgd.DaoBase;
import plataforma.spring.ServiceDefault;
import projeto.administrativo.atividade.cdp.KAtividade;
import projeto.administrativo.checklist.cdp.KChecklist;
import projeto.administrativo.checklist.cdp.KItemChecklist;
import projeto.administrativo.servico.cdp.OrdemKServicoKAtividade;
import projeto.administrativo.servico.cgd.DaoKServico;
import projeto.comercial.funcaoservico.cdp.FuncaoServico;
import projeto.comercial.gerenciarservico.cdp.Atividade;
import projeto.comercial.gerenciarservico.cdp.CheckList;
import projeto.comercial.gerenciarservico.cdp.ItemCheckList;
import projeto.comercial.gerenciarservico.cdp.Servico;
import projeto.comercial.gerenciarservico.cgd.DaoGerenciarServicos;
import projeto.comercial.oportunidade.cdp.OportunidadeServico;
import projeto.comercial.oportunidade.cdp.SituacaoOportunidade;
import projeto.comercial.oportunidade.cgt.ServiceOportunidade;

@ServiceDefault
public class ServiceGerenciarServicos extends ServiceCrud<Servico> {

	@Autowired
	DaoGerenciarServicos daoGerenciarServicos;

	@Autowired
	DaoKServico daoKServico;

	@Autowired
	ServiceOportunidade serviceOportunidade;

	@Override
	public DaoBase<Servico> getNucleoDaoBase() {

		return daoGerenciarServicos;
	}

	public void salvarServicoVindoDeOportunidade(Servico servico,
			OportunidadeServico oportunidade) throws Exception {
		// copiar dados de kservico
		copiarDadosDoKservico(servico);
		// salvar servico
		salvar(servico);

		// atualizar o status da oportunidade e salva;
		oportunidade.setSituacao(SituacaoOportunidade.CONCRETIZADA);
		oportunidade.setServico(servico);

		serviceOportunidade.salvar(oportunidade);

	}

	private void copiarDadosDoKservico(Servico servico) {

		//KServico kFull = daoKServico.recuperarPorIdParaCopiar(servico.getKservico().getId());

		
		List<OrdemKServicoKAtividade> ordens = daoKServico.recuperarPorKServicoParaCopiar(servico.getKservico().getId());
		for (OrdemKServicoKAtividade ordemKServicoKAtividade : ordens) {

			KAtividade katividade = ordemKServicoKAtividade.getkAtividade();
			Atividade atividade = new Atividade();

			copiarDados(atividade, katividade,ordemKServicoKAtividade.getNumeroOrdem());

			servico.getAtividades().add(atividade);
			atividade.setServico(servico);
		}


	}

	private void copiarDados(Atividade atividade, KAtividade katividade,
			int ordem) {
		atividade.setAvulsa(false);
		atividade.setDescricao(katividade.getDescricao());
		atividade.setOrdemExecucao(ordem);		
		
		//Copio as funcoes
		Set<FuncaoServico> funcoes = katividade.getFuncoes();		
		for (FuncaoServico funcaoServico : funcoes) {
			atividade.getFuncoes().add(funcaoServico);
		}
		//copiarchecklist
		Set<KChecklist> kchecklists = katividade.getListaKChecklist();
		
		for (KChecklist kChecklist : kchecklists) {
			CheckList check = new CheckList();
			check.setDescricao(kChecklist.getDescricao());
			//copiar itens do checklist
			copiarItensCheckList(check,kChecklist);
			
			atividade.getChecklists().add(check);
		}
		

	}

	private void copiarItensCheckList(CheckList check, KChecklist kChecklist) {
		
		Set<KItemChecklist> itens = kChecklist.getListaKItemChecklist();
		
		for (KItemChecklist kItemChecklist : itens) {
			ItemCheckList novoItem = new ItemCheckList();
			
			novoItem.setDescricaoVerificao(kItemChecklist.getDescricaoVerificao());
			novoItem.setNumeroDeOrdemNoChecklist(kItemChecklist.getNumeroDeOrdemNoKChecklist());
			
			check.getItensChecklist().add(novoItem);
			
		}
		
	}

}
